package cn.edu.tju.ldj.analytics.alphas;

import cn.edu.tju.ldj.analytics.vo.Contract;

public class Alpha0 extends IAlphaEngine {
	public void processSimulation(Contract ct, boolean isOutJson) {
		if (isOutJson) {
			logger.info("\n\nAlpha0 ------------" + ct.getCtrctName()
					+ "-------- START");
		}
		strategyTest(ct, isOutJson);
		if (isOutJson) {
			logger.info("Alpha0 ------------" + ct.getCtrctName()
					+ "--------  END");
		}
	}

	/**
	 * @param args
	 */

	protected void getWhereWeAre() {
		if (longTermStat == STAT_FALL) {
			if (midTermStat == STAT_FALL) {// 长期趋势为跌
				if (shortTermStat == STAT_FALL) { // 蓝红黄 当前处于跌势 重空
					curState = STAT_FALL;
					logInfo("当前下行中当前下行中当前下行中-------------------");
					if (tenTwnIndex <= fiveTenIndex
							&& tenTwnIndex <= fiveTwnIndex) {// 当前下行中
						if (tenTwnIndex <= WINDOW_INDEX / 4 && isProceedGap()
								&& isProceedGap(WINDOW_INDEX / 3)) { // 开空仓窗口
																		// 这里暂时不理会当前价格
							getWhatToDo(POSITION_SEL_HAV);
							logInfo("开空仓窗口 这里暂时不理会当前价格");
						}
					} else {
						if (isProceedGap() && isProceedGap(WINDOW_INDEX / 3)
								&& tenTwnIndex <= WINDOW_INDEX) {// 确定的开空信号，重仓
							getWhatToDo(POSITION_SEL_HAV);
							logInfo("蓝红黄, 确定的开空信号，重仓");
						}
					}
				} else if (shortTermStat == STAT_RISE) { // 蓝黄红 平空仓
					if (isTwiTriUpAvgTwn() && curPosition < 0) {// 前三日有两日突破廿日均线，平仓
						getWhatToDo(POSITION_INIT);
						logInfo("前三日有两日突破廿日均线，平仓");
					}
				}

				// 熔断保险
				if (isLotus()) {
					getWhatToDo(POSITION_INIT);
					logInfo("出水芙蓉，平仓闪人");
				}
			} else if (midTermStat == STAT_RISE) {// 黄蓝红 跌势结束信号
				if (shortTermStat == STAT_RISE) {
					logInfo(isTriRise() + "---" + fiveTenIndex + "---"
							+ fiveTwnIndex + "---" + tenTwnIndex + "---"
							+ curPosition);
					if (isTriRise() && fiveTenIndex < WINDOW_INDEX / 6 && fiveTwnIndex < WINDOW_INDEX / 6
							&& tenTwnIndex > WINDOW_INDEX / 3) {
						getWhatToDo(POSITION_INIT);
						logInfo("三日连涨，但是短期三线交叉，为短期小幅做空信号，本系统观望");
					} else if (isObveTwnAvg() && isProceedGap(WINDOW_INDEX / 3)) {// 前两交易均日收于蓝线上方，为买入加仓信号，持轻多仓
						getWhatToDo(POSITION_INIT);
						logInfo("前两交易均日收于蓝线上方，本系统观望");
					}
				}

				// 熔断保险
				if (isGuillotine()) {
					getWhatToDo(POSITION_INIT);
					logInfo("断头铡刀，平仓闪人");
				}
			}
		} else if (longTermStat == STAT_RISE) { // 长期趋势为涨
			if (midTermStat == STAT_FALL) {
				if (shortTermStat == STAT_FALL) { // 红蓝黄 开始下跌信号，中空
					curState = STAT_FALL;
					if (isProceedGap() && isProceedGap(WINDOW_INDEX / 3)) {
						getWhatToDo(POSITION_SEL_MID);
						logInfo("红蓝黄  开始下跌信号，中空");
					}
				}

				// 熔断保险
				if (isLotus()) {
					getWhatToDo(POSITION_INIT);
					logInfo("出水芙蓉，平仓闪人");
				}
			} else if (midTermStat == STAT_RISE) {// 中期涨势
				if (shortTermStat == STAT_RISE) { // 黄红蓝 纯涨 重多仓
					if (!isTwiFall() && tenTwnIndex <= WINDOW_INDEX / 4
							&& isProceedGap() && isProceedGap(WINDOW_INDEX / 4)) { // 开多仓窗口
						getWhatToDo(POSITION_BUY_HAV);
						logInfo("开多仓窗口 这里暂时不理会当前价格");
					}
					if (curPosition < 0) {
						getWhatToDo(POSITION_INIT);
						logInfo("上涨区间不宜开空，平仓");
					}
				} else if (shortTermStat == STAT_FALL) {// 红黄蓝
						// 一般出现在上涨回调阶段，因为这种回调没有特别参考意义，所以无视
				}

				// 熔断保险
				if (isGuillotine()) {
					getWhatToDo(POSITION_INIT);
					logInfo("断头铡刀，平仓闪人");
				}
			}
		}
	}
}
